JavaScript 作用域和变量提升

JavaScript 的传值与传址

复制类型与引用类型

复制: 数字,布尔值,字符串(字符串无法改变,无法确定,行为类似于复制类型)
引用: 数组,对象,函数等

1
2
3
4
5
6
7
8
9
10
// 复制类型
var a = 1;
var b = a;
b++;
a == 1 // true,因为 b 的修改不影响 a,b 是 a 的复制
// 引用类型
var c = [1];
var d = c;
d[0]++;
c; // [2] 因为 d = c 时赋值的是 a 地址的引用

复制类型和引用类型在函数参数中的应用

传值的传递,传给函数的是数值的一个复制,函数中对其的修改对外部不可见.

1
2
3
4
5
6
var a = 1;
function change(a){
return a = 2;
}
change(a);
a; // 1

传址的传递,传递给函数的是数值的引用.函数对其属性的内部修改外部可见,但函数内部新引用覆盖旧引用时,外部不可见,这也就是闭包的私有变量特性

1
2
3
4
5
6
7
8
var a = [1,2,3],b=[4,5]
function change(a,b){
a[0] = 9; // 属性修改
b = [6,6,6]; // 覆盖引用
}
change(a,b)
a; // [9,2,3]
b; // [4,5]

但如果函数并未传递参数,根据作用域链向上查找,可以修改函数外部变量.

1
2
3
4
5
6
7
8
var a = [1,2,3],b=[4,5]
function change(){
a[0] = 9; // 向函数外部查找变量 a
b = [6,6,6]; // 向函数外部查找变量 b
}
change(a,b)
a; // [9,2,3]
b; // [6,6,6]